package com.example.children.controller;

import com.example.children.annotation.AllowGuestAccess;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import org.springframework.web.bind.annotation.RequestBody;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;


@MultipartConfig
public class BaseServlet extends HttpServlet {   //抽象类

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("BaseServlet");
        req.setCharacterEncoding("UTF-8");
        req.getQueryString(); // 获取查询字符串（查询参数）
        String uri = req.getRequestURI(); // 获取请求的 URI
        System.out.println("uri = " + uri);
        String methodName = new String(uri.substring(uri.lastIndexOf("/") + 1)).toString(); // 从 URI 中提取方法名
        System.out.println("方法名：" + methodName);
        Method method = null;
        Method[] methods = this.getClass().getDeclaredMethods(); // 获取当前类中所有声明的方法
        String contentType = req.getContentType(); // 获取请求的内容类型
        System.out.println("请求类型为：" + contentType);
        ObjectMapper objectMapper = new ObjectMapper(); // 用于将 JSON 转换为 Java 对象
        JsonNode jsonNode = null;

//        Class<?> clazz = Login.class;
//
//        // 获取所有声明的方法（包括 private 和 protected 方法）
//        Method[] declaredMethods = clazz.getDeclaredMethods();
//        System.out.println("Declared methods:");
//        for (Method method : declaredMethods) {
//            System.out.println(method.getName());
//        }
//
//        // 获取所有公共方法（包括继承的公共方法）
//        Method[] publicMethods = clazz.getMethods();
//        System.out.println("\nPublic methods:");
//        for (Method method : publicMethods) {
//            System.out.println(method.getName());
//        }

        boolean methodFound = false; // 标记是否找到匹配的方法

        for (Method m : methods) {
            System.out.println("进入" + m.getName() + "循环！！！");
            if ("POST".equals(req.getMethod())) {
                System.out.println("POST请求");
                System.out.println("方法名：" + methodName);

                // 检查是否有 AllowGuestAccess 注解
                if (m.getAnnotation(AllowGuestAccess.class) != null) {
                    // 如果方法有 AllowGuestAccess 注解，执行该方法
                    System.out.println("方法 " + m.getName() + " 有 AllowGuestAccess 注解，执行方法...");
                    method = m;
                    methodFound = true;

                    // 获取方法参数
                    Parameter[] parameters = method.getParameters(); // 从 method 对象中提取出方法的所有参数
                    Object[] args = new Object[parameters.length]; // 用于存储方法参数的值
                    System.out.println("参数个数：" + parameters.length);

                    for (int i = 0; i < parameters.length; i++) {
                        Annotation[] annotations = parameters[i].getAnnotations(); // 获取参数上的注解
                        if (annotations == null || annotations.length == 0) {
                            // 根据参数类型填充参数值
                            if (parameters[i].getType() == HttpServletRequest.class) {
                                args[i] = req;
                            } else if (parameters[i].getType() == HttpServletResponse.class) {
                                args[i] = resp;
                            }
                        } else {
                            // 处理带有自定义注解的参数
                            System.out.println("正在处理带有自定义注解的参数");
                            for (Annotation annotation : annotations) {
                                if (annotation instanceof RequestBody) {
                                    // 使用自定义注解的逻辑来填充参数值
                                    RequestBody jsonData = (RequestBody) annotation;
//                                    System.out.println("正在注入：" + name);
                                    // 这里可以添加代码根据注解从请求中获取数据并注入到参数中
                                }
                            }
                        }
                    }

                    // 调用方法
                    try {
                        m.setAccessible(true); // 如果方法是 private，需要设置可访问
                        m.invoke(this, args); // 执行方法，传递参数
                    } catch (Exception e) {
                        e.printStackTrace();
                        resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                        resp.getWriter().write("方法调用失败: " + e.getMessage());
                    }
                    break; // 找到方法并执行后，跳出循环
                }
            }
        }

        if (!methodFound) {
            // 如果没有找到带有 AllowGuestAccess 注解的方法，返回响应给前端
            resp.setStatus(HttpServletResponse.SC_FORBIDDEN); // 403 Forbidden
            resp.getWriter().write("您无权访问此资源.");
        }
    }
}









